package Year22_Month04.day14;

public class 长度最小的子数组 {
    //暴力解法
    public static int minSubArrayLen1(int target, int[] nums) {
        int left = 0;//定义窗口左指针下标
        int right = 0;//定义窗口右指针下标
        int lengthRs = target;//定义最小的窗口长度
        boolean flagMe = false;
        for (left = 0; left < nums.length; left++) {
            //现在开始滑动
            int res = nums[left];//记录窗口和
            int lengthNow = 1;//定义当前窗口的长度
            right = left + 1;//右指针不能和左指针同一个下标
            //如果说当前窗口和小于target或者说右指针越界了就不能循环了
            while(res < target && right < nums.length){
                res += nums[right];
                lengthNow++;
                right++;
            }
            boolean flag = false;
            if(res >= target){
                //进行一个标志位判断，看一下最后结果是不是大于target
                flag = true;
                flagMe = true;
            }
            //进行判断，看一下当前窗口的长度和当前记录的最小窗口长度那个小
            if(flag && lengthRs > lengthNow){
                lengthRs = lengthNow;
            }
        }
        if(flagMe){
            return lengthRs;
        }
        return 0;
    }
    public int minSubArrayLen(int target, int[] nums) {
        int left = 0;
        int sum = 0;//定义当前的窗口内的值的和
        int lengthRs = Integer.MAX_VALUE;//定义窗口长度，这里取最大值
        for (int right = 0; right < nums.length; right++) {//定义右指针为right，然后开始遍历
            //每次都把结果加到sum上
            sum += nums[right];
            while(sum >= target){//如果窗口内的和大于target，就不能再继续移动right指针了，就要准备移动left指针
                lengthRs = Integer.min(lengthRs,right - left + 1);//这里更新下标长度
                sum -= nums[left];//当前窗口值大于target，所以减去左边指针的值
                left++;//更新left指针
            }
        }
        //如果是最后长度是Integer.MAX_VALUE，那就证明窗口所有的和加起来都小于target
        return lengthRs == Integer.MAX_VALUE ? 0 : lengthRs;
    }

    public static void main(String[] args) {
        int targht = 7;
        int[] arr = {2,3,1,2,4,3};
        System.out.println(minSubArrayLen1(targht,arr));
    }
}
